package auth

class UserprofileController extends AuthBaseController{

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

	
	
	def beforeInterceptor = [action:this.&before,only:['delete', 'update', 'edit']]
	
	/**
	 * beforeInterceptor needs to be a wrapper that can be called without parameters.
	 * Grails would raise voodoo errors if hasPerms() was called directly from within
	 * the dictionary above
	 */
	def before = {
		// this prohibits manipulation of not-owned objects
		hasPerms(Userprofile, "user")
	}
	
	  
	/**
	 * Es wird �berpr�ft, ob der User in der Session NICHT als 'admin' eingelogt ist. Wenn er nicht eingelogt ist, wird er auf die login-Methode
	 * des UserControllers umgeleitet. Anderfalls wird 'false' wiedergegeben.
	 * @return boolean false
	 */
	def auth() {
		 if( !(session?.user?.role == "admin") ){
	  flash.message = "Nur Administratoren koennen diese Aufgabe erledigen"
	  redirect(controller:"user", action:"login")
	  return false
		}
	}
	
	  /**
	  * Die Index-Methode leitet auf 'List' um
	  */
	def index = {
        redirect(action: "showData", params: params)
    }

	/**
	* Die list-Methode gibt 10 Instanzen an einen View
	*/

	/**
	* Die create-Methode legt eine neue Auction-Instanz an und �bergibt die Parameter aus dem zugeh�rigen View
	* an diese Instanz.
	* @return AuctionInstance mit Properties
	*/
    def create = {
        def userprofileInstance = new Userprofile()
        userprofileInstance.properties = params
        return [userprofileInstance: userprofileInstance]
    }

	/**
	* Die save-Methode legt eine neue Auction-Instanz an und �bergibt die Parameter aus dem zugeh�rigen View
	* an diese Instanz. Au�erdem wird der Session-User an die Instanz angehangen.
	* Falls die Instanz gespeichert wurde, wird eine Nachricht ausgegeben und auf die show-methode umgeleitet.
	* Andernfalls wird die Instanz an den create-View �bergeben und dieser aufgerufen.
	*/
    def save = {
        def userprofileInstance = new Userprofile(params)
        if (userprofileInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), userprofileInstance.id])}"
            redirect(action: "showData", id: userprofileInstance.id)
        }
        else {
            render(view: "create", model: [userprofileInstance: userprofileInstance])
        }
    }

	/**
	* Die show-Methode listet alle Auction-Instanzen nach ihrer ID.
	* Falls keine Auctionen vorhanden sind, wird eine Fehler-Nachricht ausgegeben und auf die list-Methode umgeleitet.
	* Andernfalls wird zur n�chsten ID �bergegangen.
	* @return AuctionInstance
	*/
    
	
	//TODO - implement check user
	def showData = {
        def user = User.get(session.user.id)
		def userprofileInstance = user.profile
        if (!userprofileInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
            redirect(controller: "user", action: "login")
        }
        else {
            [userprofileInstance: userprofileInstance]
        }
    }
	
	
	
	

	
    def edit = {
        def userprofileInstance = Userprofile.get(params.id)
        if (!userprofileInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
            redirect(action: "showData")
        }
        else {
            return [userprofileInstance: userprofileInstance]
        }
    }

	/**
	* Die update-Methode ruft eine AuctioInstance mit ihrer ID auf.
	* Falls die Instanz abrufbar ist
	* 	Falls deren aktuelle Version neuer ist als die gespeicherte, wurde sie zwischenzeitlich von anderem User editiert. Dann wird die Instanz an
	* 	den edit-View übergeben und die Schleife beendet.
	* 	Falls die Instanz fehlerhaft abgespeichert ist, wird der show-view mit dieser Instanz aufgerufen.
	* 	Andernfalls wird die Instanz an den edit-View übergeben.
	* Andernfalls wird auf die list-Methode umgeleitet.
	*/
    def update = {
        def userprofileInstance = Userprofile.get(params.id)
        if (userprofileInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (userprofileInstance.version > version) {
                    
                    userprofileInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'userprofile.label', default: 'Userprofile')] as Object[], "Another user has updated this Userprofile while you were editing")
                    render(view: "edit", model: [userprofileInstance: userprofileInstance])
                    return
                }
            }
            userprofileInstance.properties = params
            if (!userprofileInstance.hasErrors() && userprofileInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), userprofileInstance.id])}"
                redirect(action: "showData", id: userprofileInstance.id)
            }
            else {
                render(view: "edit", model: [userprofileInstance: userprofileInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
            redirect(action: "showData")
        }
    }

	/**
	* Die delete-Methode versucht die Instanz aufzurufen. Falls diese vorhanden ist, wird probiert sie zu löschen. Fehler werden dabei über eine
	* Nachricht aufgefangen. Beim erfolgreichen Löschen wird auf die list-Methode umgeleitet, bei nicht-Erfolg wird die Instanz an den show-View
	* übergeben.
	* Falls die Instanz nicht aufgerufen werden kann, wird auf die list-Methode umgeleitet.
	*/
    def delete = {
        def userprofileInstance = Userprofile.get(params.id)
        if (userprofileInstance) {
            try {
                userprofileInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
                redirect(action: "showData")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
                redirect(action: "showData", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'userprofile.label', default: 'Userprofile'), params.id])}"
            redirect(action: "showData")
        }
    }
	
}
